Mizer is a tool that can be used to simulate a dynamic size spectrum in an marine ecosystem, subject to changes through time, such as fishing pressure. Multiple interacting species and fishing gears can be defined allowing for a range of fisheries management strategy scenarios, and their ecosystem impacts, to be tested.
Below we explore some examples of what can be done using a previously calibrated Mizer model.
First, we load the necessary packages.
Species Collapse and Recovery in a Heavily Fished Multispecies System
In this example we will read in a calibrated model for the North Sea, which consists of 12 interacting species and a background resource. All species are predators and prey since they feed according to size-based rules and they encounter each other.
More information on how this model was calibrated with historical data can be found in our "mizerHowTo" package [tutorial link HTOM3] and in this [blogpost].
You can take a look at how the modelled species biomasses change through time by running the following:
# species' biomass through time
plotlyBiomass(sim,start_time = 1950,end_time = 2018)
# look at size spectra in final 5 years
plotSpectra(sim,time_range = c(2015:2018),power=2)
You need to upgrade your MizerParams object with `upgradeParams()`.

Projecting future recovery scenarios
We may now wish to explore the potential recovery the larger species and sizes in the system. To do this we set up another scenario, where the model starts with the last time step of the fished scenario.
First let's take a look at what the model has used in the historical period (from ICES stock assessments).
effort<-melt(sim@effort) %>% filter(time >= 1980)
There were 12 warnings (use warnings() to see them)
plot_effort<-ggplot(effort) +
geom_line(aes(x = time, y = value, colour = gear))+
theme_pubr() +
labs(y="Effort",x="")
plot_effort

The species' maximum fishing mortality rates (which we call for convenience effort) for Cod and Saithe have declined but are not as low as what would be in line with single-species "Fmsy" (a reference level of fishing deemed sustainable from single-species stock assessements) and the fishing mortality rate for Sprat and Dab is very high.
We can the values directly like this:
sim@effort["2018",]
Sprat Sandeel N.pout Dab
1.24000000 0.08454123 0.31100000 1.27800000
Herring Gurnard Sole Whiting
0.19100000 0.37737415 0.33500000 0.19800000
Plaice Haddock Saithe Cod
0.19200000 0.24700000 0.41900000 0.32000136
There were 50 or more warnings (use warnings() to see the first 50)
Let's start a new simulation that begins with the effort from 2018 and projects forward for 50 years. We will apply a linear reduction in effort for a selected species to a target value (here assumed for simplicity to be 0.2 with effort expressed in terms of the species' fishing mortality rate for fully selected sizes).
To do this need to work with the effort array (time x gear) to enable changes in effort through time, for this scenario. Here we have a 'gear' for each species, since effort in this case were annual single-species fishing mortality estimates.
select_species="Sprat"
proj_effort<-sim_status_quo@effort
target<-0.2
# reach target by 10 years
proj_effort[1:10,select_species]<-seq(from = proj_effort[1,select_species], to = target, length = 10)
# then hold at target
proj_effort[11:51,select_species]<-target
# check it
proj_effort[,select_species]
# run the simulation forward, using the 2018 abundances as initial values
sim_scen<-project(params,initial_n = sim@n["2018",,], initial_n_pp = sim@n_pp["2018",],effort=proj_effort)
# plot change in biomass relative to 2018 values
plotBiomass(sim_scen)
B_current<-getBiomass(sim_scen)[1,]
Brel_scen<-melt(sweep(getBiomass(sim_scen),2, B_current,"/"))
ggplot(Brel_scen)+ geom_line(aes(x=time,y=value,color=sp)) +
geom_hline(yintercept = 1, linetype=1, colour="grey", size=0.75) +
theme_pubr()
We can see that when we reduce fishing on Sprat it increases the biomass of this species but also affects the biomass of other species in the community.
Are any species collapsed still?
Brel_ref <- Brel_scen %>%
Warning messages:
1: In readChar(file, size, TRUE) : truncating string with embedded nuls
2: In readChar(file, size, TRUE) : truncating string with embedded nuls
3: In readChar(file, size, TRUE) : truncating string with embedded nuls
4: In readChar(file, size, TRUE) : truncating string with embedded nuls
5: In readChar(file, size, TRUE) : truncating string with embedded nuls
6: In readChar(file, size, TRUE) : truncating string with embedded nuls
mutate(collapsed = value < 0.1)
ggplot(Brel_scen, aes(x = time, y = value, fill = collapsed)) +
geom_col(position = "identity") +
geom_hline(yintercept = 0.1, linetype=1, colour="red", size=0.75) +
geom_hline(yintercept = 0.5, linetype=1, colour="dark grey", size=0.75) +
scale_fill_manual(values = alpha(c("blue", "red"), .3)) +
facet_wrap(vars(sp))+
theme_void()

Exploration options - break into smaller groups:
- Cut and paste the above code chunks and edit it to explore your own fishing scenarios.
- Alter some of of the model parameters to see how this affects the scenario outcomes.
- Using the unfished sim object examine the effects of adding a species to the model
Further Exploration (Optional)
Example 2: Set up an explore a time-varying fishing scenario
We could examine how this fish community would have responded if there had been a completly different historical development of fishing fleets over time.
Here we will examine how some commonly used community indicators of the ecosystem effects of fishing change in response to this scenario.
We can alter the fishing parameters using a function called gear_params() and by changing the effort input.
Let's take a look at the fishing parameters. Note that the gears in the above model were already setup to be species-specific.
# look at the gear set up:
gear_params(params)
We can group these species together according to the gears they are caught by. Let's imagine a big super trawler.
# allocate species to gear types
gear_params(params)$gear <- c("super_trawler")
Note that catchability is set to 1. This is because the fishing "effort" was here assumed to be the fishing mortality rate of fully selected sizes (see here link to setFishing on mizer website).
The previous effort won't work with these new gears, as it is gear x time. We only have a single gear now, so this is easier to set up.
Example 3: Adding a variable environment
Now we can look at probability of collapse.
LS0tCnRpdGxlOiBXaHkgdXNlIE1pemVyPwpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpNaXplciBpcyBhIHRvb2wgdGhhdCBjYW4gYmUgdXNlZCB0byBzaW11bGF0ZSBhIGR5bmFtaWMgc2l6ZSBzcGVjdHJ1bSBpbiBhbiBtYXJpbmUgZWNvc3lzdGVtLCBzdWJqZWN0IHRvIGNoYW5nZXMgdGhyb3VnaCB0aW1lLCBzdWNoIGFzIGZpc2hpbmcgcHJlc3N1cmUuIE11bHRpcGxlIGludGVyYWN0aW5nIHNwZWNpZXMgYW5kIGZpc2hpbmcgZ2VhcnMgY2FuIGJlIGRlZmluZWQgYWxsb3dpbmcgZm9yIGEgcmFuZ2Ugb2YgZmlzaGVyaWVzIG1hbmFnZW1lbnQgc3RyYXRlZ3kgc2NlbmFyaW9zLCBhbmQgdGhlaXIgZWNvc3lzdGVtIGltcGFjdHMsIHRvIGJlIHRlc3RlZC4KCkJlbG93IHdlIGV4cGxvcmUgc29tZSBleGFtcGxlcyBvZiB3aGF0IGNhbiBiZSBkb25lIHVzaW5nIGEgcHJldmlvdXNseSBjYWxpYnJhdGVkIE1pemVyIG1vZGVsLiAKCkZpcnN0LCB3ZSBsb2FkIHRoZSBuZWNlc3NhcnkgcGFja2FnZXMuCgpgYGB7ciBzZXQtdXAsIGVjaG8gPSBGLG1lc3NhZ2U9Riwgd2FybmluZz1GfQpsaWJyYXJ5KG1pemVySG93VG8pCnJlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJzaXplc3BlY3RydW0vbWl6ZXJFeHBlcmltZW50YWwiKQpsaWJyYXJ5KG1pemVyRXhwZXJpbWVudGFsKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShnZ3B1YnIpCiMgUm9tYWluIGFuZCBHdXN0YXY6IGNhbiB0aGUgYmUgYSBzaG9ydCBjdXQgdG8gdGhlIHNpbSBvYmplY3QgdGhhdCBJIGNhbGlicmF0ZWQ/IEFkIGNhbGwgaXQgSFRNMF9zaW0/CnNpbTwtcmVhZFJEUygifi9Ecm9wYm94L0hPVyBUTyBtaXplci9Db3Vyc2UvSG93VG8vaW5zdC9IVE0zL3NpbV9vcHRfdGltZS5SRFMiKQojIGFsc28gSSBuZWVkIHRvIHJlcnVuIHRoZSBjYWxpYnJhdGlvbiBhbmQgcG9zdCBibG9nIGJlZm9yZSB3ZSBkbyB0aGUgc2Vzc2lvbiEKIyB1cGdyYWRlIHBhcmFtcwpwYXJhbXM8LXVwZ3JhZGVQYXJhbXMoc2ltQHBhcmFtcykKZWZmb3J0PC1zaW1AZWZmb3J0CmBgYAoKIyMjIFNwZWNpZXMgQ29sbGFwc2UgYW5kIFJlY292ZXJ5IGluIGEgSGVhdmlseSBGaXNoZWQgTXVsdGlzcGVjaWVzIFN5c3RlbQoKSW4gdGhpcyBleGFtcGxlICB3ZSB3aWxsIHJlYWQgaW4gYSBjYWxpYnJhdGVkIG1vZGVsIGZvciB0aGUgTm9ydGggU2VhLCB3aGljaCBjb25zaXN0cyBvZiAxMiBpbnRlcmFjdGluZyBzcGVjaWVzIGFuZCBhIGJhY2tncm91bmQgcmVzb3VyY2UuIEFsbCBzcGVjaWVzIGFyZSBwcmVkYXRvcnMgYW5kIHByZXkgc2luY2UgdGhleSBmZWVkIGFjY29yZGluZyB0byBzaXplLWJhc2VkIHJ1bGVzIGFuZCB0aGV5IGVuY291bnRlciBlYWNoICBvdGhlci4gCgpNb3JlIGluZm9ybWF0aW9uIG9uIGhvdyB0aGlzIG1vZGVsIHdhcyBjYWxpYnJhdGVkIHdpdGggaGlzdG9yaWNhbCBkYXRhIGNhbiBiZSBmb3VuZCBpbiBvdXIgIm1pemVySG93VG8iIHBhY2thZ2UgW3R1dG9yaWFsIGxpbmsgSFRPTTNdIGFuZCBpbiB0aGlzIFtibG9ncG9zdF0uIAoKWW91IGNhbiB0YWtlIGEgbG9vayBhdCBob3cgdGhlIG1vZGVsbGVkIHNwZWNpZXMgYmlvbWFzc2VzIGNoYW5nZSB0aHJvdWdoIHRpbWUgYnkgcnVubmluZyB0aGUgZm9sbG93aW5nOgoKYGBge3J9CiMgc3BlY2llcycgYmlvbWFzcyB0aHJvdWdoIHRpbWUKcGxvdGx5QmlvbWFzcyhzaW0sc3RhcnRfdGltZSA9IDE5NTAsZW5kX3RpbWUgPSAyMDE4KQojIGxvb2sgYXQgc2l6ZSBzcGVjdHJhIGluIGZpbmFsIDUgeWVhcnMKcGxvdFNwZWN0cmEoc2ltLHRpbWVfcmFuZ2UgPSBjKDIwMTU6MjAxOCkscG93ZXI9MikKYGBgCgojIyBFeGFtaW5pbmcgY2hhbmdlcyBpbiB0aGUgY29tbXVuaXR5IHJlbGF0aXZlIHRvIGFuIHVuZmlzaGVkIHN0YXRlIAoKVG8gYmUgYWJsZSB0byBleGFtaW5lIGFueSBjaGFuZ2VzIGluIHRoZSBjb21tdW5pdHkgcmVsYXRpdmUgdG8gYW4gdW5maXNoZWQgc3RhdGUgd2UgY2FuIHJlLXNldCBlZmZvcnQgPSAwIGFuZCBjYWxjdWxhdGUgdGhlIHN0ZWFkeSBzdGF0ZS4gCgpgYGB7ciwgZXZhbCA9IFQsIGVjaG8gPSBGLCB3YXJuaW5nPUZ9CnNpbTAgPC0gcHJvamVjdFRvU3RlYWR5KHNpbTBAcGFyYW1zLCBlZmZvcnQgPSAwLCByZXR1cm5fc2ltID0gVCx0X21heD0xMDApCnBsb3RseUJpb21hc3Moc2ltMCkKIyAgb3IgY291bGQgc2V0IHRoZSBpbml0aWFsIE4gdG8gdGhpcyBzdGF0ZSwgd291bGQgYmUgYmV0dGVyPyBiZXR0ZXIgdG8gc2V0ICB0aGlzIHVwIGluIGFkdmFuY2Ugc28gd2UgZG9udCBoYXZlIHRvIGRvIGl0IGhlcmU/CmBgYAoKV2UgY2FuIGNvbXBhcmUgdGhlIGN1cnJlbnQgIHNpemUgIHNwZWN0cmEgKGF2ZXJhZ2VkIG92ZXIgMjAxNS0yMDE5KSB0byB0aGUgdW5maXNoZWQgc2l6ZSBzcGVjdHJhIHRvIGFzc2VzcyB3aGV0aGVyIHRoZXJlIGlzIGFueSBldmlkZW5jZSBvZiBhIHNpemUtc3RydWN0dXJlZCB0cm9waGljIGNhc2NhZGUgZHVlIHRvIGZpc2hpbmcuCgpgYGB7ciAsIGNvZGVfZm9sZGluZz1UUlVFLCBldmFsID0gVCwgZWNobyA9IEYsIHdhcm5pbmc9Rn0KcmVsYXRpdmVfbjwtbWVsdChzaW1AblsiMjAxOSIsLF0vc2ltMEBuW2RpbShzaW0wQG4pWzFdLCxdKQoKcGxvdF9yZWxhdGl2ZV9uPC1nZ3Bsb3QocmVsYXRpdmVfbikgKyAKZ2VvbV9saW5lKGFlcyh4ID0gdywgeSA9IHZhbHVlLCBjb2xvdXIgPSBzcCkpICsKc2NhbGVfeV9jb250aW51b3VzKHRyYW5zID0gImxvZzEwIikgKwpzY2FsZV94X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiKSArCmdlb21faGxpbmUoeWludGVyY2VwdCA9IDEsIGxpbmV0eXBlPTEsIGNvbG91cj0iZGFyayBncmV5Iiwgc2l6ZT0wLjc1KSArIAp0aGVtZV9wdWJyKCkgKwpsYWJzKHk9IlJlbGF0aXZlIEFidW5kYW5jZSIseD0iV2VpZ2h0IFtnXSIpICAKCnBsb3RfcmVsYXRpdmVfbgoKYGBgCgpIZXJlIHdlIGNhbiBzZWUgdGhlIGVmZmVjdCBvZiB0aGUgcmVkdWN0aW9uIGluIGxhcmdlIHNpemVkIGluZGl2aWR1YWxzIG9mIGhlYXZpbHkgZmlzaGVkIG9uIHRoZSBvdGhlciBzaXplcyBhbmQgc3BlY2llcyBpbiB0aGUgbW9kZWwsIHJlbGF0aXZlIHRvIHRoZSB1aWZpc2hlZCBzdGVhZHkgc3RhdGUuIAoKVGhlIGFidW5kYW5jZSBvZiBzb21lIChidXQgbm90IGFsbCkgb2YgdGhlIHNtYWxsZXIgdG8gbWVkaXVtIHNpemVzIG9mIHByZXkgYXJlIGEgbG90IGhpZ2hlciAgd2hlbiB0aGVpciBsYXJnZXIgcHJlZGF0b3JzIGFyZSByZW1vdmVkIChub3RlIHRoZSBsb2dhcml0aG1pYyBzY2FsZSkuCgpTcHJhdCBsb29rcyB0byBiZSBtdWNoIGxvd2VyLgoKV2UgY2FuIGRvIHRoZSBzYW1lIHdpdGggQmlvbWFzcyB0byBzZWUgd2hlbiwgaWYgYW55LCBvZiB0aGUgc3BlY2llcyBjb2xsYXBzZS4gRm9yIHNpbXBsaWNpdHksIHdlIHVzZSA8IDAuMSBvZiBCL0JfdW5maXNoZWQgYXMgYSBwcm94eSBmb3IgYSByZWZlcmVuY2UgcG9pbnQgZm9yIHBvcHVsYXRpb24gY29sbGFwc2UuIFdlIGNhbiBhZGQgb3RoZXIgcmVmZXJlbmNlIHBvaW50cyB0byB0aGlzIGtpbmQgb2YgcGxvdCwgZm9yIGV4YW1wbGUgYSBzaW1wbGUgcnVsZSBvZiB0aHVtYiBmb3IgQl9tc3kgY291bGQgYmUgIDAuNSpCX3VuZmlzaGVkLgoKYGBge3IsY29kZV9mb2xkaW5nPVRSVUUsIGV2YWwgPSBULCBlY2hvID0gRiwgd2FybmluZz1GfQoKIyBzZWxlY3QgdGhlIHNwZWNpZXMgIChvciBzaG91bGQgd2Ugc2V0IHRoaXMgdXAgd2l0aCBhbGwgc3BlY2llcywgbGlrZSBwbG90bHlCaW9tYXNzLCBzaG91bGQgd2UgbWFrZSB0aGVzZSBwbG90cyBpbiBidWlsdCBmdW5jdGlvbnM/KQoKQjA8LWdldEJpb21hc3Moc2ltMClbZGltKHNpbTBAbilbMV0sXQpCcmVsPC1tZWx0KHN3ZWVwKGdldEJpb21hc3Moc2ltKSwyLCBCMCwiLyIpKQoKc2VsZWN0X3NwZWNpZXM9IlNwcmF0IgoKQnJlbF9zZWxlY3QgPC0gQnJlbCAlPiUKICBmaWx0ZXIoc3AgPT0gc2VsZWN0X3NwZWNpZXMgJiB0aW1lID49IDE5NTApIAoKCnBsb3RfQnJlbDwtZ2dwbG90KEJyZWxfc2VsZWN0KSsgZ2VvbV9saW5lKGFlcyh4PXRpbWUseT12YWx1ZSkpICsgCnRoZW1lX3B1YnIoKSArIApnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjEsIGxpbmV0eXBlPTEsIGNvbG91cj0icmVkIiwgc2l6ZT0wLjc1KSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC41LCBsaW5ldHlwZT0xLCBjb2xvdXI9InN0ZWVsIGJsdWUiLCBzaXplPTAuNzUpICsKbGFicyh4PSIiLHk9IlJlbGF0aXZlIEJpb21hc3MiKSArCnNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsbWF4KEJyZWxfc2VsZWN0JHZhbHVlKSkpCgpwbG90X0JyZWw8LSBwbG90X0JyZWwgICsKYW5ub3RhdGUoInRleHQiLHggPSAxOTUxLCB5ID0gMC4xKzAuMDUsIGxhYmVsID0gIkJsaW0iLGNvbG9yPSJyZWQiKSsKYW5ub3RhdGUoInRleHQiLHggPSAxOTUxLCB5ID0gMC41KzAuMDUsIGxhYmVsID0gIkJtc3kiLGNvbG9yPSJzdGVlbCBibHVlIikrCmFubm90YXRlKCJ0ZXh0Iix4ID0gMjAxNSwgeSA9IG1heChCcmVsX3NlbGVjdCR2YWx1ZSksIGxhYmVsID0gc2VsZWN0X3NwZWNpZXMsY29sb3I9ImJsYWNrIikgCgpwbG90X0JyZWwKCiMgd2hpY2ggeWVhcnMgPCAwLjEgQl91bmZpc2hlZAoKQnJlbF9zZWxlY3QgPC0gQnJlbCAlPiUKICBmaWx0ZXIoc3AgPT0gIlNwcmF0IiAmIHRpbWUgPj0gMTk1MCkgJT4lCiAgbXV0YXRlKGNvbGxhcHNlZCA9IHZhbHVlIDwgMC4xKQoKZ2dwbG90KEJyZWxfc2VsZWN0LCBhZXMoeCA9IHRpbWUsIHkgPSB2YWx1ZSwgZmlsbCA9IGNvbGxhcHNlZCkpICsKICBnZW9tX2NvbChwb3NpdGlvbiA9ICJpZGVudGl0eSIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjEsIGxpbmV0eXBlPTEsIGNvbG91cj0iZGFyayBncmV5Iiwgc2l6ZT0wLjc1KSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYWxwaGEoYygiYmx1ZSIsICJyZWQiKSwgLjMpKSArCiAgdGhlbWVfcHVicigpCgpgYGAKCgojIyBQcm9qZWN0aW5nIGZ1dHVyZSByZWNvdmVyeSBzY2VuYXJpb3MgCgpXZSBtYXkgbm93IHdpc2ggdG8gZXhwbG9yZSB0aGUgcG90ZW50aWFsIHJlY292ZXJ5IHRoZSBsYXJnZXIgc3BlY2llcyBhbmQgc2l6ZXMgaW4gdGhlIHN5c3RlbS4gVG8gZG8gdGhpcyB3ZSBzZXQgIHVwIGFub3RoZXIgc2NlbmFyaW8sIHdoZXJlIHRoZSBtb2RlbCBzdGFydHMgd2l0aCB0aGUgbGFzdCB0aW1lIHN0ZXAgb2YgdGhlIGZpc2hlZCBzY2VuYXJpby4KCkZpcnN0IGxldCdzIHRha2UgYSBsb29rIGF0IHdoYXQgdGhlIG1vZGVsIGhhcyB1c2VkIGluIHRoZSBoaXN0b3JpY2FsIHBlcmlvZCAoZnJvbSBJQ0VTIHN0b2NrIGFzc2Vzc21lbnRzKS4KCmBgYHtyfQplZmZvcnQ8LW1lbHQoc2ltQGVmZm9ydCkgICU+JSBmaWx0ZXIodGltZSA+PSAxOTgwKQoKcGxvdF9lZmZvcnQ8LWdncGxvdChlZmZvcnQpICsgCmdlb21fbGluZShhZXMoeCA9IHRpbWUsIHkgPSB2YWx1ZSwgY29sb3VyID0gZ2VhcikpKyAKdGhlbWVfcHVicigpICsKbGFicyh5PSJFZmZvcnQiLHg9IiIpIAoKcGxvdF9lZmZvcnQKYGBgCgpUaGUgc3BlY2llcycgbWF4aW11bSBmaXNoaW5nIG1vcnRhbGl0eSByYXRlcyAod2hpY2ggd2UgY2FsbCBmb3IgY29udmVuaWVuY2UgZWZmb3J0KSBmb3IgQ29kIGFuZCBTYWl0aGUgaGF2ZSBkZWNsaW5lZCBidXQgYXJlIG5vdCBhcyBsb3cgYXMgd2hhdCB3b3VsZCBiZSBpbiBsaW5lIHdpdGggc2luZ2xlLXNwZWNpZXMgIkZtc3kiIChhIHJlZmVyZW5jZSBsZXZlbCBvZiBmaXNoaW5nICBkZWVtZWQgc3VzdGFpbmFibGUgZnJvbSAgc2luZ2xlLXNwZWNpZXMgc3RvY2sgYXNzZXNzZW1lbnRzKSBhbmQgdGhlIGZpc2hpbmcgbW9ydGFsaXR5IHJhdGUgZm9yIFNwcmF0IGFuZCBEYWIgaXMgdmVyeSBoaWdoLiAKCldlIGNhbiB0aGUgdmFsdWVzIGRpcmVjdGx5IGxpa2UgdGhpczoKCmBgYHtyfQpzaW1AZWZmb3J0WyIyMDE4IixdCmBgYAoKCkxldCdzIHN0YXJ0IGEgbmV3IHNpbXVsYXRpb24gdGhhdCBiZWdpbnMgd2l0aCB0aGUgZWZmb3J0IGZyb20gMjAxOCBhbmQgcHJvamVjdHMgZm9yd2FyZCBmb3IgNTAgeWVhcnMuCldlIHdpbGwgYXBwbHkgYSBsaW5lYXIgcmVkdWN0aW9uIGluIGVmZm9ydCBmb3IgYSBzZWxlY3RlZCBzcGVjaWVzIHRvIGEgdGFyZ2V0IHZhbHVlIChoZXJlIGFzc3VtZWQgZm9yIHNpbXBsaWNpdHkgdG8gYmUgMC4yIHdpdGggZWZmb3J0IGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiB0aGUgc3BlY2llcycgZmlzaGluZyBtb3J0YWxpdHkgcmF0ZSBmb3IgZnVsbHkgc2VsZWN0ZWQgc2l6ZXMpLgoKVG8gZG8gdGhpcyBuZWVkIHRvIHdvcmsgd2l0aCB0aGUgZWZmb3J0IGFycmF5ICh0aW1lIHggZ2VhcikgdG8gZW5hYmxlIGNoYW5nZXMgaW4gZWZmb3J0IHRocm91Z2ggdGltZSwgZm9yIHRoaXMgc2NlbmFyaW8uIEhlcmUgd2UgaGF2ZSBhICdnZWFyJyBmb3IgZWFjaCBzcGVjaWVzLCBzaW5jZSBlZmZvcnQgaW4gdGhpcyBjYXNlIHdlcmUgYW5udWFsIHNpbmdsZS1zcGVjaWVzIGZpc2hpbmcgbW9ydGFsaXR5IGVzdGltYXRlcy4KCgpgYGB7cn0Kc2VsZWN0X3NwZWNpZXM9IlNwcmF0Igpwcm9qX2VmZm9ydDwtc2ltX3N0YXR1c19xdW9AZWZmb3J0CnRhcmdldDwtMC4yCgojIHJlYWNoIHRhcmdldCBieSAxMCB5ZWFycwpwcm9qX2VmZm9ydFsxOjEwLHNlbGVjdF9zcGVjaWVzXTwtc2VxKGZyb20gPSBwcm9qX2VmZm9ydFsxLHNlbGVjdF9zcGVjaWVzXSwgdG8gPSB0YXJnZXQsIGxlbmd0aCA9IDEwKQoKIyB0aGVuIGhvbGQgYXQgdGFyZ2V0CnByb2pfZWZmb3J0WzExOjUxLHNlbGVjdF9zcGVjaWVzXTwtdGFyZ2V0CgojIGNoZWNrIGl0CnByb2pfZWZmb3J0WyxzZWxlY3Rfc3BlY2llc10KCiMgcnVuIHRoZSBzaW11bGF0aW9uIGZvcndhcmQsIHVzaW5nIHRoZSAyMDE4IGFidW5kYW5jZXMgYXMgaW5pdGlhbCB2YWx1ZXMKCnNpbV9zY2VuPC1wcm9qZWN0KHBhcmFtcyxpbml0aWFsX24gPSBzaW1AblsiMjAxOCIsLF0sIGluaXRpYWxfbl9wcCA9IHNpbUBuX3BwWyIyMDE4IixdLGVmZm9ydD1wcm9qX2VmZm9ydCkKCiMgcGxvdCBjaGFuZ2UgaW4gYmlvbWFzcyByZWxhdGl2ZSB0byAyMDE4IHZhbHVlcwoKcGxvdEJpb21hc3Moc2ltX3NjZW4pCgpCX2N1cnJlbnQ8LWdldEJpb21hc3Moc2ltX3NjZW4pWzEsXQoKQnJlbF9zY2VuPC1tZWx0KHN3ZWVwKGdldEJpb21hc3Moc2ltX3NjZW4pLDIsIEJfY3VycmVudCwiLyIpKQoKZ2dwbG90KEJyZWxfc2NlbikrIGdlb21fbGluZShhZXMoeD10aW1lLHk9dmFsdWUsY29sb3I9c3ApKSArIApnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAxLCBsaW5ldHlwZT0xLCBjb2xvdXI9ImdyZXkiLCBzaXplPTAuNzUpICsKdGhlbWVfcHVicigpCgpgYGAKCldlIGNhbiBzZWUgdGhhdCB3aGVuIHdlIHJlZHVjZSBmaXNoaW5nIG9uIFNwcmF0IGl0IGluY3JlYXNlcyB0aGUgYmlvbWFzcyBvZiB0aGlzIHNwZWNpZXMgYnV0IGFsc28gYWZmZWN0cyB0aGUgYmlvbWFzcyBvZiBvdGhlciBzcGVjaWVzIGluIHRoZSBjb21tdW5pdHkuCgpBcmUgYW55IHNwZWNpZXMgY29sbGFwc2VkIHN0aWxsPwoKYGBge3J9CgpCcmVsX3JlZjwtbWVsdChzd2VlcChnZXRCaW9tYXNzKHNpbV9zY2VuKSwyLCBCMCwiLyIpKQoKQnJlbF9yZWYgPC0gQnJlbF9zY2VuICAlPiUKICBtdXRhdGUoY29sbGFwc2VkID0gdmFsdWUgPCAwLjEpCgpnZ3Bsb3QoQnJlbF9zY2VuLCBhZXMoeCA9IHRpbWUsIHkgPSB2YWx1ZSwgZmlsbCA9IGNvbGxhcHNlZCkpICsKICBnZW9tX2NvbChwb3NpdGlvbiA9ICJpZGVudGl0eSIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjEsIGxpbmV0eXBlPTEsIGNvbG91cj0icmVkIiwgc2l6ZT0wLjc1KSArCiAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuNSwgbGluZXR5cGU9MSwgY29sb3VyPSJkYXJrIGdyZXkiLCBzaXplPTAuNzUpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBhbHBoYShjKCJibHVlIiwgInJlZCIpLCAuMykpICsKICBmYWNldF93cmFwKHZhcnMoc3ApKSsKICB0aGVtZV92b2lkKCkKYGBgCgoKIyMgRXhwbG9yYXRpb24gb3B0aW9ucyAtIGJyZWFrIGludG8gc21hbGxlciBncm91cHM6CgoxLiBDdXQgYW5kIHBhc3RlIHRoZSBhYm92ZSBjb2RlIGNodW5rcyBhbmQgZWRpdCBpdCB0byBleHBsb3JlIHlvdXIgb3duIGZpc2hpbmcgc2NlbmFyaW9zLgpgYGB7cn0KCmBgYAoKMi4gQWx0ZXIgc29tZSBvZiBvZiB0aGUgbW9kZWwgcGFyYW1ldGVycyB0byBzZWUgaG93IHRoaXMgYWZmZWN0cyB0aGUgc2NlbmFyaW8gb3V0Y29tZXMuCmBgYHtyfQoKYGBgCgozLiBVc2luZyB0aGUgdW5maXNoZWQgc2ltIG9iamVjdCBleGFtaW5lIHRoZSBlZmZlY3RzIG9mIGFkZGluZyBhIHNwZWNpZXMgdG8gdGhlIG1vZGVsCgpgYGB7cn0KCmBgYAoKCgojIyMgRnVydGhlciBFeHBsb3JhdGlvbiAoT3B0aW9uYWwpCgojIyBFeGFtcGxlIDI6IFNldCB1cCBhbiBleHBsb3JlIGEgdGltZS12YXJ5aW5nIGZpc2hpbmcgc2NlbmFyaW8KCldlIGNvdWxkIGV4YW1pbmUgaG93IHRoaXMgZmlzaCBjb21tdW5pdHkgd291bGQgaGF2ZSByZXNwb25kZWQgaWYgdGhlcmUgaGFkIGJlZW4gYSBjb21wbGV0bHkgZGlmZmVyZW50IGhpc3RvcmljYWwgZGV2ZWxvcG1lbnQgb2YgZmlzaGluZyBmbGVldHMgb3ZlciB0aW1lLgoKSGVyZSB3ZSB3aWxsIGV4YW1pbmUgaG93IHNvbWUgY29tbW9ubHkgdXNlZCBjb21tdW5pdHkgaW5kaWNhdG9ycyBvZiB0aGUgZWNvc3lzdGVtIGVmZmVjdHMgb2YgZmlzaGluZyBjaGFuZ2UgaW4gcmVzcG9uc2UgdG8gdGhpcyBzY2VuYXJpby4KCiBXZSBjYW4gYWx0ZXIgdGhlICBmaXNoaW5nIHBhcmFtZXRlcnMgdXNpbmcgYSBmdW5jdGlvbiBjYWxsZWQgKmdlYXJfcGFyYW1zKCkqIGFuZCBieSBjaGFuZ2luZyB0aGUgKmVmZm9ydCogaW5wdXQuIAogCiBMZXQncyB0YWtlIGEgbG9vayBhdCB0aGUgZmlzaGluZyBwYXJhbWV0ZXJzLiBOb3RlIHRoYXQgdGhlIGdlYXJzIGluIHRoZSBhYm92ZSBtb2RlbCB3ZXJlIGFscmVhZHkgc2V0dXAgdG8gYmUgc3BlY2llcy1zcGVjaWZpYy4KIApgYGB7cn0KIyBsb29rIGF0IHRoZSBnZWFyIHNldCB1cDoKZ2Vhcl9wYXJhbXMocGFyYW1zKQpgYGAKIAogCldlIGNhbiBncm91cCB0aGVzZSBzcGVjaWVzICB0b2dldGhlciBhY2NvcmRpbmcgdG8gdGhlIGdlYXJzIHRoZXkgYXJlIGNhdWdodCBieS4gIExldCdzIGltYWdpbmUgYSBiaWcgc3VwZXIgdHJhd2xlci4gCgpgYGB7cn0KIyBhbGxvY2F0ZSBzcGVjaWVzIHRvIGdlYXIgdHlwZXMKZ2Vhcl9wYXJhbXMocGFyYW1zKSRnZWFyIDwtIGMoInN1cGVyX3RyYXdsZXIiKQpgYGAKCgpOb3RlIHRoYXQgY2F0Y2hhYmlsaXR5IGlzIHNldCB0byAxLiBUaGlzIGlzIGJlY2F1c2UgdGhlIGZpc2hpbmcgImVmZm9ydCIgd2FzIGhlcmUgYXNzdW1lZCB0byBiZSB0aGUgZmlzaGluZyBtb3J0YWxpdHkgcmF0ZSBvZiBmdWxseSBzZWxlY3RlZCBzaXplcyAoc2VlIGhlcmUgKmxpbmsgdG8gc2V0RmlzaGluZyBvbiBtaXplciB3ZWJzaXRlKikuCgpUaGUgcHJldmlvdXMgZWZmb3J0IHdvbid0IHdvcmsgd2l0aCB0aGVzZSBuZXcgZ2VhcnMsIGFzIGl0IGlzIGdlYXIgeCB0aW1lLiBXZSBvbmx5IGhhdmUgYSBzaW5nbGUgZ2VhciBub3csIHNvIHRoaXMgaXMgZWFzaWVyIHRvIHNldCB1cC4KCmBgYHtyfQoKYGBgCgoKCiMjIyBFeGFtcGxlIDM6IEFkZGluZyBhIHZhcmlhYmxlIGVudmlyb25tZW50CgpgYGB7cn0KCmBgYAoKCk5vdyB3ZSBjYW4gbG9vayBhdCBwcm9iYWJpbGl0eSBvZiBjb2xsYXBzZS4K